import inspect
from typing import Any, Callable, List

from src.globals.globals import GlobalManage
from src.handle.event_handler.handler_decorator import HandlerRegister
from src.log.logger import setup_logger


class HandlerManager:
    """Handler管理器
    
    负责管理和协调所有事件处理器（handlers）。主要功能包括：
    1. 初始化和管理事件处理器
    2. 处理事件订阅和分发
    3. 管理处理器的生命周期
    
    Attributes:
        logger: 日志记录器实例
        global_manage: 全局管理器实例，用于访问共享资源
        handlers: 存储所有已注册的处理器实例
    """
    
    def __init__(self, global_manage: GlobalManage):
        """初始化Handler管理器
        
        Args:
            global_manage: 全局管理器实例，提供事件发布等功能
        """
        self.logger = setup_logger("handler.manager")
        self.global_manage = global_manage
        self.handlers: List[Callable[..., Any]] = []  # 存储所有处理器实例
        
    def init_handlers(self) -> None:
        """初始化所有已注册的handlers
        
        执行流程：
        1. 从HandlerRegister获取所有注册的处理器类
        2. 为每个处理器类创建实例
        3. 注册处理器的事件订阅
        
        Raises:
            Exception: 初始化过程中的任何错误
        """
        try:
            self.logger.info("开始初始化handlers...")
            
            # 遍历所有注册的处理器类
            for handler_cls in HandlerRegister._instances.values():
                # 创建处理器实例
                handler = handler_cls(self.global_manage)
                # 添加到处理器列表
                self.handlers.append(handler)
                
                # 注册该处理器的所有事件订阅
                for topic, funcs in HandlerRegister._handlers.items():
                    for func_name, func in funcs.items():
                        # 检查方法是否属于当前处理器类
                        if func.__qualname__.startswith(handler_cls.__name__):
                            self.logger.info(f"订阅事件: {topic} -> {func.__name__}")
                            # 订阅事件
                            self.global_manage.pub.subscribe(
                                getattr(handler, func.__name__),  # 获取实例方法
                                topic  # 事件主题
                            )
                            self.logger.info(f"订阅事件成功: {topic} -> {func.__name__}")
            
            self.logger.info("handlers初始化完成")
            
        except Exception as e:
            self.logger.error(f"初始化handlers失败: {str(e)}")
            raise
            
    async def stop_handlers(self) -> None:
        """停止所有handlers
        
        执行流程：
        1. 遍历所有处理器实例
        2. 调用它们的stop方法（如果存在）
        3. 清空处理器列表
        
        Note:
            - 即使某个处理器停止失败，也会继续停止其他处理器
            - 最后会清空处理器列表，无论是否有错误发生
        """
        self.logger.info("正在停止所有handlers...")
        for handler in self.handlers:
            if hasattr(handler, 'stop'):
                try:
                    if inspect.iscoroutinefunction(getattr(handler, 'stop')):
                        self.logger.info(f"handler.stop是异步函数: {handler.__class__.__name__}")
                        await handler.stop()
                    else:
                        self.logger.info(f"handler.stop是同步函数: {handler.__class__.__name__}")
                        handler.stop()
                except Exception as e:
                    self.logger.error(f"停止handler失败: {str(e)}")
        self.handlers.clear()  # 清空处理器列表 